package com.witsight.platform.util.lang;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

/**
 * 说明：字符串工具类型
 * 
 * @Title: StringUtil.java
 * @Package com.witsight.platform.util.lang
 * @See: {@link StringUtils} 
 * @Copyright: Copyright (c) 2017 
 * @Company:sany huax witsight team by product
 * @author: penght
 * @date: 2017年9月11日 下午2:41:27
 * @version: V1.0
 *
 */
public abstract class StringUtil extends StringUtils {
	
	/** 模版正则表达式**/
	private static final Pattern TEMPLATE_PATTERN = Pattern.compile("\\$\\{[^}]+\\}(?:\\s*[-+*/]\\s*\\\\$\\{[^}]+\\})*");

	
	/**
	 * 说明：object转换成string
	 * 
	 * @Title: objectToString
	 * @See:
	 * @author penght
	 * @param obj
	 *            需要转换对象
	 * @return 转换后的值
	 * @date: 2016年4月22日 下午3:02:38
	 */
	public static String objectToString(Object obj) {
		if (obj == null) {
			return "";
		}
		String str = String.valueOf(obj);
		return str;
	}
	
	/**
	 * 说明：object 转换成默认的 string
	 * 
	 * @Title: objectToString
	 * @See:
	 * @author penght
	 * @param obj
	 *            转换对象
	 * @param defaultValue
	 *            默认参数
	 * @return 转换后的结果
	 * @date: 2016年4月22日 下午3:04:45
	 */
	public static String objectToString(Object obj, String defaultValue) {
		if (obj == null) {
			return defaultValue;
		}
		String str = String.valueOf(obj);
		return str;
	}
	/**
	 * 将驼峰式命名的字符串转换为下划线大写方式。如果转换前的驼峰式命名的字符串为空，则返回空字符串。</br>
	 * 例如：HelloWorld->HELLO_WORLD
	 * 
	 * @param name
	 *            转换前的驼峰式命名的字符串
	 * @return 转换后下划线大写方式命名的字符串
	 */
	public static String underscoreName(String name) {
		StringBuilder result = new StringBuilder();
		if (name != null && name.length() > 0) {
			// 将第一个字符处理成大写
			result.append(name.substring(0, 1).toUpperCase());
			// 循环处理其余字符
			for (int i = 1; i < name.length(); i++) {
				String s = name.substring(i, i + 1);
				// 在大写字母前添加下划线
				if (s.equals(s.toUpperCase()) && !Character.isDigit(s.charAt(0))) {
					result.append("_");
				}
				// 其他字符直接转成大写
				result.append(s.toUpperCase());
			}
		}
		return result.toString();
	}

	/**
	 * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空，则返回空字符串。</br>
	 * 例如：HELLO_WORLD->HelloWorld
	 * 
	 * @param name
	 *            转换前的下划线大写方式命名的字符串
	 * @return 转换后的驼峰式命名的字符串
	 */
	public static String camelName(String name) {
		StringBuilder result = new StringBuilder();
		// 快速检查
		if (name == null || name.isEmpty()) {
			// 没必要转换
			return "";
		} else if (!name.contains("_")) {
			// 不含下划线，仅将首字母小写
			return name.substring(0, 1).toLowerCase() + name.substring(1);
		}
		// 用下划线将原始字符串分割
		String camels[] = name.split("_");
		for (String camel : camels) {
			// 跳过原始字符串中开头、结尾的下换线或双重下划线
			if (camel.isEmpty()) {
				continue;
			}
			// 处理真正的驼峰片段
			if (result.length() == 0) {
				// 第一个驼峰片段，全部字母都小写
				result.append(camel.toLowerCase());
			} else {
				// 其他的驼峰片段，首字母大写
				result.append(camel.substring(0, 1).toUpperCase());
				result.append(camel.substring(1).toLowerCase());
			}
		}
		return result.toString();
	}
	/**
	 * 
	 * 说明：Convert a comma delimited list (e.g., a row from a CSV file) into an
	 * array of strings.
	 * @Title: commaDelimitedListToStringArray
	 * @See: {@link org.springframework.util.StringUtils#commaDelimitedListToStringArray(String)}
	 * @author penght
	 * @param str the input {@code String}
	 * @return an array of strings, or the empty array in case of empty input
	 * @date: 2017年10月11日 下午5:09:25
	 */
	public static String[] commaDelimitedListToStringArray(String str) {
		return org.springframework.util.StringUtils.commaDelimitedListToStringArray(str);
	}
	/**
	 * Trim <i>all</i> whitespace from the given {@code String}:
	 * leading, trailing, and in between characters.
	 * @param str the {@code String} to check
	 * @return the trimmed {@code String}
	 * @see org.springframework.util.StringUtils#trimAllWhitespace(String)
	 */
	public static String trimAllWhitespace(String str) {
		return org.springframework.util.StringUtils.trimAllWhitespace(str);
	}

	/**
	 * 
	 * 说明：根据class名称取得模块名称
	 * 
	 * @Title: getModel
	 * @See: {@link #getModel(String, String)}
	 * @author penght
	 * @param className
	 *            class名称
	 * @param defaultPackage
	 *            过滤得默认名称
	 * @return 模块名称
	 * @date: 2016年10月12日 上午8:28:15
	 */
	public static String getModel(String className, String defaultPackage) {
		String model = "COMMON";
		if (StringUtil.isEmpty(className)) {
			return model;
		}

		String[] strs = StringUtil.split(className, ".");
		if (strs.length < 2) {
			return model;
		}
		model = strs[strs.length - 2];
		if (StringUtil.equalsIgnoreCase("IMPL", model) && strs.length > 2) {
			model = strs[strs.length - 3];
		}
		if (StringUtil.equalsIgnoreCase(defaultPackage, model)) {
			model = "COMMON";
		}
		return StringUtil.upperCase(model);
	}
	/**
	 * 
	 * 说明：根据模版查找key
	 * @Title: findKeysByTemplate
	 * @See: {@link #findKeysByTemplate(String)}
	 * @author penght
	 * @param value 模版值
	 * @return key的集合
	 * @date: 2017年11月8日 上午8:16:37
	 */
	public static Collection<String> findKeysByTemplate(String value) {
		Set<String> keys = new HashSet<>();
		Matcher matcher = TEMPLATE_PATTERN.matcher(value);
		if (matcher.find()) {
			do {
				String key = matcher.group();
				key = StringUtil.trimToEmpty(StringUtil.replaceEach(key, new String[] {"${","}"}, new String[] {"",""}));
				keys.add(key);
			} while(matcher.find());
		}
		return keys;
	}
	/**
	 * 
	 * 说明：根据String转换
	 * 
	 * @Title: floatToString
	 * @See: {@link #floatToString(Float f)}
	 * @author lianwq
	 * @param floatToString
	 * @return String
	 * @date: 2018年04月24日 上午10:44:15
	 */
	public static String floatToString(Float f) {	
		return String.valueOf(f);
	}
	
	/**
	 * 
	 * 说明：说明：10进制转16进制
	 * @Title: TenHexToSixteen
	 * @See: {@link #TenHexToSixteen(Integer i)}
	 * @author lianwq
	 * @param i
	 * @return String
	 * @date: 2018年5月28日 下午2:22:02
	 */
	public static String TenHexToSixteen(Integer i) {	
		return Integer.toHexString(i);
	}
}
